#ifndef MACRO_H
#define MACRO_H

#include <QByteArray>
#include <QtCore>
#include <QHash>
class QRegExp;
#define ServerPortData  6788//主要给应用程序发送视频数据的端口
#define aServerPort 6789  //服务器对应用程序的端口
#define serverPortForGW  6790  //服务器对WSN网关的UDP端口

//server的server的通信端口。主要用于UDP打洞
//#define PORT_SERVER_OF_SERVER 10000

#define dataBaseComUdpPort 9617  //dataBaseCom程序的UDP端口

//#define ThreadClientNumber 5  //5个线程处理用户请求
//#define IndexOfThreadClientForEventSQLTimer 0 //0号线程处理读取AliveCmdRec
#define MsForEventSQLTimer 10000  //10s查询一次ALiveCmdRec表
#define maxTimesOfRealTime  60  //实时数据状态最多持续60*MsForEventSQLTimer.

#define maxRowCount 60  //SQL语句最多返回60行结果
#define tcpServerPort 56789  //TCP服务器端口,用于监听
#define tcpServerPortS 56790  //TCP服务器端口,用于监听和发送

#define MaxSizeBeginVideo 100 //认为海康视频开始帧不大于100字节

#define msForUpdate 1800000

//每天重新注册一次。 另外，当自己的IP变化时，会主动重新注册。
//检测自己的IP变化的方法是，看看能不能收到来自自己的因特网地址的数据包
#define MSForUpdataONS 86400000

#define macBytes 8  //节点的mac地址为8字节长度
#define NodeInfoSensorTypeBytes 1  //数据包中的传感器信息占1字节
#define CmdAckStatusBytes 1

#define TTL_MAX 300  //用于保持网关节点与物联网平台的连接。对应300秒。
#define P2P_TTL_MAX 10  //用于P2p中。
#define EVENT_TTL_MAX 15 //用于事件包的处理中。对应15分钟。

#define PEER_THREAD_NUM 3 //3个threadpeer，用于UDP数据的发送

#define MSForDBConnect 3600000 //每隔1小时与数据库连接一次，防止MySQl has gone away

//#define debu

#define UDP_MAX_SEND_TIMES 2 //UDP包最多重发2次，如果仍然不成功，则放弃
#define UDP_MAX_WAIT_MSECS 500 //UDP最多等待500ms
#define UDP_MAX_Bytes 8192 //UDP包最大8192字节

#define UDP_MAX_PendingCount 40 //最多连续处理40个UDP数据包，多余的抛弃，防止程序死掉

#define MAX_ProcessEvents_MiliSecs 500 //最多等待事件处理500ms

#define MY_URI "iot://GWICT.GW.wsn.tnsroot.cn" //一个网关注册两个URI，另一个URI是视频数据发送的socket注册的
//aServerIP是服务器的IP，不要写作localhost,也不要写作“127.0.0.1”这样的IP，否则会出现问题。
//程序中需要localhos时，直接使用QHostAddress::LocalHost
#define aServerIP  "127.0.0.1"

//#define DB_TYPE "QSQLITE"
#define DB_TYPE "QMYSQL"

//#define DB_NAME "example.db"
#define DB_NAME "example"

#define DB_HOST "localhost"
#define DB_USERNAME "rwsn"
#define DB_PWD "sensor"

#ifndef ANDROID
//#define ANDROID
#endif


#define OBJ_OWNER tr("网络技术研究中心")
#define OBJ_LOC tr("计算所")
#define ONS_IP "218.241.108.59"
#define ONS_Port 4446

//现在的版本中，不再给因特网上某一主机发心跳，而是给自己的因特网地址发送心跳。
//参考了《一种NAT端口映射保持的自适应算法》，效果未验证
#define heartInternetInterval  600000 //600s 的心跳间隔
#define DatagramOfHeartInternet "INFO:HELLO SERVER. This is Heart Packet."  //确保所有字母大写，且字符间空格不超过1个

//根据网关节点接口协议的调整而修改
#define HEADER "aa44"

#define PktNormSensorType 0x10
#define PktEventSensorType 0x11
#define PktVideoType 0x13
#define PktHeartBeat 0x71
#define PktNodeInfo 0x41  //节点基本信息包
#define PktSensorInfo 0x44  //传感器信息包
#define PktQurySensorInfo 0x52 //查询节点传感器信息
#define PktConfiACK 0x61 //配置信息ACK包的包类型编码

#define PktCmdPrimaryType 0x20
#define PktCmdAckPrimaryType 0x30
#define PktNetWorkPrimaryType 0x70

#define TypeUp 0x01  //上行数据
#define TypeDown 0x02  //下行数据

#define NodeInfoMac 0x02  //节点信息包中的Mac信息
#define NodeInfoSensors 0x03  //节点信息包中的传感器类型
#define SensorInfoPins 0x01  //传感器信息包中，管脚信息的编号
#define SensorInfoBytes 0x02  //传感器信息包中，字节数信息的编号
#define SensorInfoSensorTypeAllSensors 0x00  //传感器信息包中，表示所有传感器的编号

#define SensorTypeVideoMin 9
#define SensorTypeVideoMax 24
#define SensorTypeVideoMJPEG 12

#define SENSORID_RFID 43  //RFID的传感器编号

#define IPPosByteInAppMac 2  //数据包中，App的IP位于Mac的第几个字节处（从0起）
#define UDPPortPosByteInAppMac 6  //数据包中，App的UDP端口位于Mac的第几个字节处

#define Adapter_Telnet_UDPPort  9023 //可以任意取
#define HeartToIOTServerInterval 60000 //每隔60s给中间件发送一次心跳

#define TTL_MAX 300  //用于保持节点与该程序间的连接。对应300秒。

#define TelnetReconnectIntervalMinimum 15 //第一次断开后，15s后重连
#define TelnetReconnectIntervalFactor  2   //每次重连间隔乘以1
#define TelnetReconnectTimes  2  //最多尝试重连的次数
#define TelnetSendInterval 50  //telnet最小发送间隔（毫秒）
#define TelnetMaxBufferPackets 50 //最多缓存50个TCP包

#define DB_CON_NAME_ADAPTER_TELNET "ConnectionAdapterTelnte"
#define DB_CON_NAME_ADAPTER_SERIALPORT "ConnectionAdapterSerialPort"
#define DB_CON_NAME_WEATHERSTATION "ConnectionWeatherStation"
#define DB_CON_NAME_WEBSERVER "ConInWS"
#define DB_Con_Name_ClientDataProcess "ConInClientDataProcess"


/************* AdapterTelnet需要用到的内容********************/
#define WaitACK_TTL_MAX 4  //最多重发多少次
#define WaitACK_Resend_Gap 5 //多少秒没有回复就重发
/*********************************************************/

#define Type_Pos 2 //Type的位置
#define Type_Size 1 //Type的字节数
#define Dest_Pos 3 //数据包中，目的地址的位置
#define Dest_Size 8 //数据包中，源地址的字节数
#define Source_Pos 11 //数据包中，目的地址的位置
#define Source_Size 8 //数据包中，源地址的字节数
#define SN_Pos 19 //数据包中，SN字段的位置
#define SN_Size 1  //数据包中，SN字段的字节数
#define Len_Pos 20 //数据包中，长度字段的位置
#define Len_Size 2  //数据包中，长度字段的字节数
#define PktType_Pos 22 //数据包中，包类型字段的位置
#define PktType_Size 1  //数据包中，包类型字段的字节数
#define DataType_Pos 24 //数据包中，数据类型字段的位置
#define DataType_Size 1  //数据包中，数据类型字段的字节数
#define Data_Pos 25 //数据包中，数据字段的位置
#define CRC_Size 2 //CRC的字节数

#define Min_Packet_Size 26  //包大小应该不小于这个数字
#define Max_Packet_Size 500  //假定没有大于500字节的包


#define LogFileDir "D:/IOTLog/"  //存储日志的目录

#define EnableWebServer  //去掉该行注释后，将启动webserver功能

 unsigned short MyCRC16(char* data, unsigned short len);
 QByteArray  getCRC16Hex(QByteArray dataToBeChecked);
 //将数字用16进制编码，高字节在前，宽为width
 QByteArray  mySetNumHex(qint64 uint64Num,quint8 width);
 extern QRegExp *regExpValidIP; //声明使用外部变量
 extern QHash<quint8,QByteArray> *hashCmdAckStatusIDMeaning;//声明使用外部变量

#endif // MACRO_H
